package fr.generali.accueilclient.gwt.client.ui.components.section;

import java.util.Iterator;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;

import fr.generali.accueilclient.gwt.client.ui.resources.GlobalResources;

/**
 * Une section se présente sous la forme d'un Label en dessous duquel on
 * retrouve une barre horizontale.<br>
 * Cette barre horizontale prend toute la largeur de son conteneur parent.<br>
 * Une section ne présente aucune intelligence, est se veut être un composant
 * pour structurer les données<br>
 * mais sans que celles-ci y soient liées directement.
 */
public class Section extends Composite implements HasWidgets {

    private static SectionUiBinder uiBinder = GWT.create(SectionUiBinder.class);

    interface SectionUiBinder extends UiBinder<Widget, Section> {
    }

    public interface Resources extends GlobalResources {

        @Source({"components/section/section.css" })
        Style style();

        interface Style extends CssResource {
            String section();

            String border();

            String actionLinkLabel();

            String titleLabel();

            String alternateLabel();
        }
    }

    /** Le Bundle contenant les Css associés au widget. */
    @UiField
    protected Resources res;

    /** Le libellé de la section */
    @UiField
    Label nameLabel;

    @UiField
    FlowPanel header;

    @UiField
    Label actionLink;

    @UiField
    FlowPanel container;

    @UiField
    Label alternateLabel;

    public Section() {
        initWidget(uiBinder.createAndBindUi(this));
        res.style().ensureInjected();
    }

    public Section(String intituleSection) {
        initWidget(uiBinder.createAndBindUi(this));
        res.style().ensureInjected();
        nameLabel.setText(intituleSection);
    }

    public void setText(String text) {
        nameLabel.setText(text);
    }

    public void setAlternateLabel(String text) {
        alternateLabel.setText(text);
    }

    public void useAlternateLabel(Boolean use) {
        alternateLabel.setVisible(use);
        header.setVisible(!use);
    }

    public void setBorder(boolean hasBorder) {
        if (hasBorder) {
            if (!header.getStyleName().contains(res.style().border())) {
                header.addStyleName(res.style().border());
            }
        } else {
            if (header.getStyleName().contains(res.style().border())) {
                header.removeStyleName(res.style().border());
            }
        }
    }

    public void setActionLinkLabel(String actionLinkLabel) {
        actionLink.setText(actionLinkLabel);
        actionLink.setVisible(true);
    }

    protected HandlerRegistration addActionLinkClickHandler(ClickHandler clickHandler) {
        return actionLink.addClickHandler(clickHandler);
    }

    public void setActionLinkVisible(Boolean visible) {
        actionLink.setVisible(visible);
    }

    @Override
    public void add(Widget w) {
        container.add(w);
    }

    @Override
    public void clear() {
        container.clear();
    }

    @Override
    public Iterator<Widget> iterator() {
        return container.iterator();
    }

    @Override
    public boolean remove(Widget w) {
        return container.remove(w);
    }

    public void show() {
        container.setVisible(true);
        actionLink.setVisible(false);
    }

    public void hide() {
        container.setVisible(false);
        actionLink.setVisible(true);
    }

    public void setContentVisibility(Boolean visible) {
        container.setVisible(visible);
    }

    public Boolean isContentVisible() {
        return container.isVisible();
    }

    public void showActionLink() {
        actionLink.setVisible(true);
    }

}
